﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using pwblog.Entities;
using pwblog.DataAccess;
using pwblog.Common;

namespace pwblog.BusinessObject
{
    public class AccountBo
    {
        AccountDao accountDao = new AccountDao();

        /// <summary>
        /// Kiểm tra username vs password đã tồn tại trong hệ thống chưa ?
        /// </summary>
        /// <param name="userName">UserName</param>
        /// <param name="password">Password</param>
        /// <returns>true/false</returns>
        public string CheckAccount(string userName, string password)
        {
            try
            {
                password = MD5Utility.Encode(password);
                Account account = accountDao.GetAccount(userName, password);
                return account.Roles;
            }
            catch(Exception ex)
            {
                return null;
            }
        }

        /// <summary>
        /// lấy UserName tất cả các tài khoản
        /// </summary>
        /// <returns></returns>
        public string[] GetUserNames()
        {
            Account[] accounts = accountDao.GetAccounts();
            var userNames = accounts.Select(item => item.UserName);

            return userNames.ToArray();
        }

        /// <summary>
        /// Lấy tất cả các tài khoản
        /// </summary>
        /// <returns></returns>
        public Account[] GetAccounts()
        {
            return accountDao.GetAccounts();
        }

        /// <summary>
        /// Lấy tài khoản từ Username
        /// </summary>
        /// <param name="username">username</param>
        /// <returns></returns>
        public Account GetAccountByUserID(string username)
        {
            try
            {
                return accountDao.GetAccountByUserName(username).First();
            }
            catch { return null; }
        }

        /// <summary>
        /// Lấy tài khoản từ Email
        /// </summary>
        /// <param name="email">email</param>
        /// <returns></returns>
        public Account GetAccountByEmail(string email)
        {
            try
            {
                return accountDao.GetAccountByEmail(email);
            }
            catch { return null; }
        }

        /// <summary>
        /// Cập nhật tài khoản
        /// </summary>
        /// <param name="birthday">ngày sinh</param>
        /// <param name="address">địa chỉ</param>
        /// <param name="roles">vai trò</param>
        /// <returns>true/false</returns>
        internal bool UpdateAccount(string userName, string birthday, string address, string roles)
        {
            try
            {
                Account account = accountDao.GetAccountByUserName(userName).First();
                account.Birthday = birthday;
                account.Address = address;
                account.Roles = roles;
                accountDao.UpdateAccount(account);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Xóa tài khoản
        /// </summary>
        /// <param name="userName">tên của tài khoản</param>
        /// <returns>true/false</returns>
        internal bool DeleteAccount(string userName)
        {
            try
            {
                Account account = accountDao.GetAccountByUserName(userName).First();
                accountDao.DeleteAccount(account);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }


        /// <summary>
        /// Thêm tài khoản
        /// </summary>
        /// <param name="newAccount">đối tượng tài khoản</param>
        /// <returns>true/false</returns>
        internal bool InsertAccout(Account newAccount)
        {
            try
            {
                accountDao.InsertAccount(newAccount);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// tăng số lượng bài viết lên một
        /// </summary>
        /// <param name="userName"></param>
        internal void RaiseNumberOfArticle(string userName)
        {
            try
            {
                Account account = accountDao.GetAccountByUserName(userName).First();
                account.NumberOfArticle += 1;
                accountDao.UpdateAccount(account);
            }
            catch (Exception ex)
            {
 
            }
        }

        /// <summary>
        /// Lấy tất cả tài khoản theo tên tài khoản
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        internal Account[] GetAccountByUserName(string userName)
        {
            return accountDao.GetAccountByUserName(userName);
        }

        /// <summary>
        /// Cập nhật tài khoản
        /// </summary>
        /// <param name="userName">tên tài khoản</param>
        /// <param name="birthday">ngày sinh</param>
        /// <param name="address">địa chỉ</param>
        /// <returns>true/false</returns>
        internal bool UpdateAccount(string userName, string birthday, string address)
        {
            try
            {
                Account account = accountDao.GetAccountByUserName(userName).First();
                account.Birthday = birthday;
                account.Address = address;
                accountDao.UpdateAccount(account);
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Cập nhật mật khẩu
        /// </summary>
        /// <param name="userName">tên tài khoản</param>
        /// <param name="newPassword">mật khẩu mới</param>
        /// <returns></returns>
        internal bool UpdatePassword(string userName, string newPassword)
        {
            try
            {
                /*
                System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                byte[] pw_bytes = System.Text.Encoding.UTF8.GetBytes(newPassword);
                pw_bytes = md5.ComputeHash(pw_bytes);

                newPassword = BitConverter.ToString(pw_bytes);
                */
                newPassword = MD5Utility.Encode(newPassword);

                Account account = accountDao.GetAccountByUserName(userName).First();
                account.Password = newPassword;
                accountDao.UpdateAccount(account);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Kiểm tra user đã tồn tại, trả về true nếu đã tồn tại account trong hệ thống, ngược lại trả về false
        /// </summary>
        /// <param name="userName">tên tài khoản</param>
        /// <returns></returns>
        public bool CheckExistUser(string userName)
        {
            try
            {
                if (accountDao.FindAccount(userName) != null)
                    return true;
                else return false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Kiểm tra email đã tồn tại, trả về true nếu đã tồn tại account trong hệ thống, ngược lại trả về false
        /// </summary>
        /// <param name="userName">tên tài khoản</param>
        /// <returns></returns>
        public bool CheckExistEmail(string email)
        {
            try
            {
                if (accountDao.GetAccountByEmail(email) != null)
                    return true;
                else return false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
}